package ia;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {



    public static void main(String[] args) throws FileNotFoundException, IOException {
    	   
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br     = new BufferedReader (isr);
        General n             = General.getInstancia();
        Busqueda busq         = null;
        
        boolean version90 = true; // indica si estamos con la version de 90 o 45 grados
        boolean matriz; //Si es true indicara que la matriz se lee de fichero si no se genera aleatoriamente
        

        System.out.println("Elige el metodo de entrada: \n"
                + "\t (1) -Leer matriz de fichero \"matriz\" \n"
                + "\t (2) -Generar matriz aleatoria");   
        String  aux   = br.readLine();
        boolean falla = true;
        
        
        while(falla){
            if(aux.equals("1")){
            	n.leeMatriz();  
                falla = false;            	
            }
            else if(aux.equals("2")){
            	int filas, columnas;            
            	System.out.println("Introduzca numero de filas: ");
                filas = Integer.parseInt(br.readLine());
                System.out.println("Introduzca numero de columnas: ");
                columnas = Integer.parseInt(br.readLine());
            	//GENERAR MATRIZ
                n.getMatrizAleatoria(filas, columnas);
                falla = false;                	
            }else {
                System.out.println(">>>>Valor incorrecto, introduzca 1 o 2.");
                aux = br.readLine();
            }
        }         
        System.out.println("Matriz leida...");  
        
        
        System.out.println("Elige la versión del algoritmo: \n"
                + "\t (1) -90º \n"
                + "\t (2) -45º");   
        aux = br.readLine();
        falla=true;
        while(falla){
            if(aux.equals("1")){
            	version90 = true;
                falla = false;
            }
            else if(aux.equals("2")){
            	version90 = false;
                falla = false;
            }else {
                System.out.println(">>>>Valor incorrecto, introduzca 1 o 2.");
                aux = br.readLine();
            }
        }
        
        System.out.println("Elige algoritmo de busqueda: \n"
                         + "\t (1) -Anchura \n"
                         + "\t (2) -A*");
        aux = br.readLine();
        falla=true;
        while(falla){ 
            if(aux.equals("1")){
            	if (version90)
            		busq = Anchura90.getInstancia();
            	else 
            		busq = Anchura45.getInstance();
                falla = false;
            }
            else if(aux.equals("2")){
            	if (version90)
            		busq = Aestrella90.getInstance();
            	else 
            		busq = Aestrella45.getInstance();
                falla = false;
            }else {
                System.out.println(">>>>Valor incorrecto, introduzca 1 o 2.");
                aux = br.readLine();
            }
        }
        if(aux.equals("2")){
            Heuristica h = null;
            System.out.println("Seleccione una heuristica:\n"
                             + "\t (1) -Distancia Euclidea\n"
                             + "\t (2) -Manhattan\n");
            aux = br.readLine();
            falla = true;
            while(falla){
                if(aux.equals("1")){
                	if (version90)
                		h = DistanciaEuclidea90.getInstance();
                	else 
                		h = DistanciaEuclidea45.getInstance();
                    falla = false;
                }else if(aux.equals("2")){
                	if (version90)
                		h = DistanciaManhattan90.getInstance();
                	else 
                		h = DistanciaManhattan45.getInstance();
                    falla = false;
                }else {
                    System.out.println(">>>>Valor incorrecto, introduzca 1 o 2.");
                    aux = br.readLine();
                }
            }
            if (version90)
            ((Aestrella90)busq).setHeuristica(h);
            else
            ((Aestrella45)busq).setHeuristica(h);
        }

        System.out.println("Pulse INTRO para buscar.");
        br.readLine();
        busq.buscar();

    }


}
